
;Uduoties formulavimas:
;Disassembleris MOV ir LEA komandoms;
;3 Uzduotis

;Autoriaus komentarai:
;Yra gluiku.

;Sprendimas:
;================ buferio dydis
BUFSIZE EQU 1024

;================ komandu kodai (bin)
MOV1 EQU 1000100b ; Is registro i regisra
MOV2 EQU 1000101b ; Is registro i registra d=1
MOV3 EQU 10110000b ; Tiesiai i registra paskutiniai bitai: w-1 reg-3
MOV4 EQU 1100011b ; Tiesiai i atminti
MOV5 EQU 1010000b ; Is atminties i AL,AH arba AX
MOV6 EQU 1010001b ; Is AL,AH arba AX i atminti
MOV7 EQU 10001110b ; Is registro arba atminties i segmentini registra
MOV8 EQU 10001100b ; Is segmentinio registro i registra
LEA_BIN EQU 10001101b ; LEA

;================ registrai
reg_AL_ EQU 000b
reg_BL_ EQU 011b
reg_CL_ EQU 001b
reg_DL_ EQU 010b
reg_AH_ EQU 100b
reg_BH_ EQU 111b
reg_CH_ EQU 101b
reg_DH_ EQU 110b

reg_AX_ EQU 000b
reg_BX_ EQU 011b
reg_CX_ EQU 001b
reg_DX_ EQU 010b
reg_SP_ EQU 100b
reg_BP_ EQU 101b
reg_SI_ EQU 110b
reg_DI_ EQU 111b

reg_ES_ EQU 000b
reg_CS_ EQU 001b
reg_SS_ EQU 010b
reg_DS_ EQU 011b

;================ r/m
rm_BXSI_ EQU 000b
rm_BXDI_ EQU 001b
rm_BPSI_ EQU 010b
rm_BPDI_ EQU 011b
rm_SI_ EQU 100b
rm_DI_ EQU 101b
rm_TIESIOG_ EQU 110b
rm_BX_ EQU 111b



StkSeg SEGMENT PARA STACK 'STACK'
DB 100h DUP (?)
StkSeg ENDS

Data SEGMENT WORD 'DATA'

;================ Pranesimai
HelpMsg db ' Disassembleris MOV ir LEA komandoms.', 10, 13
db ' Naudojimas: diss.exe file.exe file.asm', 10, 13,'$'

DissMsg db 'Apdorojamas failas: $'
ErrMsg db 10,13,'Klaida! Neteisingi parametrai arba blogas failo vardas.', 10, 13, '$'

;================ failu vardai
File1 db 255 dup(0)
File2 db 255 dup(0)

;================ failu rankenos
handle1 dw ?
handle2 dw ?

;================ skaitymo buferis
rbuf db BUFSIZE dup(?)

;================
asm_mov db 'MOV '
asm_lea db 'LEA '
new_line db 13, 10
im_new_line db 'h',13,10

;================ registrai

reg_al db 'al'
reg_bl db 'bl'
reg_cl db 'cl'
reg_dl db 'dl'
reg_ah db 'ah'
reg_bh db 'bh'
reg_ch db 'ch'
reg_dh db 'dh'
reg_ax db 'ax'
reg_bx db 'bx'
reg_cx db 'cx'
reg_dx db 'dx'
reg_sp db 'sp'
reg_bp db 'bp'
reg_si db 'si'
reg_di db 'di'
reg_es db 'es'
reg_cs db 'cs'
reg_ss db 'ss'
reg_ds db 'ds'

;================ r/m
rm_bxsi db '[bx:si]'
rm_bxdi db '[bx:di]'
rm_bpsi db '[bp:si]'
rm_bpdi db '[bp:di]'
rm_si db '[si]'
rm_di db '[di]'
rm_tiesiog db '[0000]'
rm_bx db '[bx]'

;============== kiti simboliai
kablelis db ','
w db 0
im_hex db '00'

;============== hex lentele xlat'ui
hex_table db '0123456789ABCDEF'

Data ENDS
;=========================================
Code SEGMENT WORD 'CODE'
ASSUME cs:Code, ds:Data
Start PROC FAR
mov ax,Data
mov ds,ax

mov ah,62h ;i bx grazina psp segmenta
int 21h
mov es,bx
xor cx,cx
mov cl,[es:0080h]
cmp cl,0
jz Help

ReadFileNames:
mov di,0081h
call SkipSpaces
lea si,File1
call ReadFn

lea dx,DissMsg
call PrintString
lea dx,File1
call PrintString
call SkipSpaces
lea si,File2
call ReadFn
cmp File2[0],'$'
je error

CreateFile:
call Fcreate

OpenFiles:
lea dx,File1
call Fopen2read
lea dx,File2
call Fopen2write

ReadWriteFiles:
call Fread
cmp ax,0
jz TheEnd
lea si, rbuf
call Fwrite
jmp ReadWriteFiles

Help:
call PrintHelp
jmp TheEnd

Error:
call PrintError
call PrintHelp
jmp TheEnd

TheEnd:
mov ah,3Eh
mov bx,handle1
int 21h
mov bx,handle2
int 21h
call toDos

Start ENDP

;=========================================
PrintString PROC NEAR
mov ah,09h
int 21h
ret
PrintString ENDP
;=========================================
PrintHelp PROC NEAR
lea dx,HelpMsg
call PrintString
ret
PrintHelp ENDP
;=========================================
PrintError PROC NEAR
lea dx,ErrMsg
call PrintString
ret
PrintError ENDP
;=========================================
ReadFn PROC NEAR
xor ah,ah
Symb:
mov al,[es:di]
cmp al,' '
je exit0
cmp al,0Dh
jz exit0
mov [si],al
inc ah
dec cx
cmp ah, 254
jz exit0
inc si
inc di
jmp Symb
exit0:
mov al,'$'
mov [si],al
ret
ReadFn ENDP
;=========================================
SkipSpaces PROC NEAR
mov al, ' '
ciklas:
cmp di,bx
jz exit00
cmp al,[es:di]
jne exit00
inc di
jmp ciklas
exit00:
ret
SkipSpaces ENDP
;=========================================
Fread PROC NEAR
mov ah,3Fh
mov bx,handle1
mov cx,BUFSIZE
lea dx,rbuf
int 21h
jc exit01
jmp exit02
exit01:
call PrintError
call toDos
exit02:
ret
Fread ENDP
;=========================================
Fwrite PROC NEAR
mov cx,ax
mov bx,handle2
lea si,rbuf
lea di,rbuf
add di,cx
Write:
cmp si,di
jge exit04
call Dissasemble
inc si
jmp Write
jc exit03
jmp exit04
exit03:
call PrintError
call toDos
exit04:
ret
Fwrite ENDP
;=========================================
Fcreate PROC NEAR
mov ah,3Ch
xor cx,cx
lea dx,File2
int 21h
jc exit05
jmp exit06
exit05:
call PrintError
call toDos
exit06:
ret
Fcreate ENDP
;=========================================
Fopen2read PROC NEAR
mov ax, 3D00h
int 21h
jc exit01
mov handle1,ax
jmp exit08

exit07:
call PrintError
call toDos
exit08:
ret
Fopen2read ENDP
;=========================================
Fopen2write PROC NEAR
mov ax, 3D01h
int 21h
jc exit10
mov handle2, ax
jmp exit11
exit10:
call PrintError
call toDos
exit11:
ret
Fopen2write ENDP
;=========================================
Dissasemble PROC NEAR
;=========================================
disMOV1:
mov al, [si]
and al,11111110b
shr al,1
cmp al, MOV1
jne disMOV2
mov cx, 4
lea dx, asm_mov
call WriteNow
mov al,[si]
and al,00000001b
mov w,al
inc si
mov al, [si]
shr al, 6
cmp al, 00000011b
jne mem1
mov al, [si]
and al,00000111b
call regFind
jmp EndFirstPara1
mem1:
mov al, [si]
and al, 00000111b
call FindMem
sub si,1

EndFirstPara1:
mov cx, 1
lea dx, kablelis
call WriteNow

mov al,[si]
and al,00111000b
shr al,3
call regFind
mov cx,2
lea dx,new_line
call WriteNow
jmp exit12
;=========================================
disMOV2:
mov al, [si]
shr al,1
cmp al, MOV2
jne disMOV3
mov cx, 4
lea dx,asm_mov
call WriteNow
mov al,[si]
and al,00000001b
mov w,al
inc si
mov al, [si]
and al,00111000b
shr al,3
call regFind
mov cx,1
lea dx,kablelis
call WriteNow
mov al, [si]
and al, 11000000b
shr al, 6
cmp al, 00000011b
jne mem2
mov al, [si]
and al, 00000111b
call regFind
jmp newline
mem2:
mov al, [si]
and al, 00000111b
call FindMem
newline:
mov cx, 2
lea dx, new_line
call WriteNow
jmp exit12
;=========================================
disMOV3:
mov al, [si]
and al,11110000b
cmp al, MOV3
jne disMOV4
mov cx, 4
lea dx, asm_mov
call WriteNow
mov al,[si]
and al,00001000b
shr al,3
mov w,al
mov al,[si]
and al,00000111b
call regFind
mov cx,1
lea dx,kablelis
call WriteNow
cmp w,1
je imWord3
inc si
call im_to_hex
mov cx,2
lea dx,im_hex
call WriteNow
mov cx, 3
lea dx, im_new_line
call WriteNow
jmp exit12
imWord3:
add si,2
call im_to_hex
mov cx,2
lea dx,im_hex
call WriteNow
dec si
call im_to_hex
mov cx,2
call WriteNow
mov cx, 3
lea dx, im_new_line
call WriteNow
jmp exit12
;=========================================
disMOV4:
mov al, [si]
shr al,1
cmp al, MOV4
jne disMOV5
mov cx, 4
lea dx, asm_mov
call WriteNow
mov al, [si]
and al,00000001b
mov w,al
inc si
mov al,[si]
and al, 00000111b
call FindMem
mov cx,1
lea dx,kablelis
call WriteNow
cmp w,1
je imWord4
inc si
call im_to_hex
mov cx,2
lea dx,im_hex
call WriteNow
mov cx, 3
lea dx, im_new_line
call WriteNow
jmp exit12
imWord4:
add si,2
call im_to_hex
mov cx,2
lea dx,im_hex
call WriteNow
dec si
call im_to_hex
mov cx,2
call WriteNow
mov cx, 3
lea dx, im_new_line
call WriteNow
jmp exit12
;=========================================
disMOV5:
mov al, [si]
shr al,1
cmp al, MOV5
jne disMOV6
mov cx, 4
lea dx, asm_mov
call WriteNow
mov al,[si]
and al,00000001b
mov w,al
mov al,0
call regFind
mov cx,1
lea dx,kablelis
call WriteNow
mov cx, 6
call adr_to_hex
lea dx, rm_tiesiog
call WriteNow
mov cx, 2
lea dx, new_line
call WriteNow
jmp exit12
;=========================================
disMOV6:
mov al, [si]
shr al,1
cmp al, MOV6
jne disMOV7
mov cx, 4
lea dx, asm_mov
call WriteNow
mov al,[si]
and al,00000001b
mov w,al
call adr_to_hex
mov cx, 6
lea dx, rm_tiesiog ;jeigu lygu - atspausdinam
call WriteNow
mov cx,1
lea dx,kablelis
call WriteNow
sub si,2
mov al,0
call regFind
mov cx, 2
lea dx, new_line
call WriteNow
jmp exit12
;=========================================
disMOV7:
mov al, [si]
cmp al, MOV7
jne disMOV8
mov cx, 4
lea dx, asm_mov
call WriteNow
inc si
mov al,[si]
and al,00111000b
shr al,3
call FindRegisterS
mov cx,1
lea dx,kablelis
call WriteNow
mov al, [si]
shr al, 6
cmp al, 00000011b
jne mem7
mov al,[si]
and al,00000111b
call FindRegisterW
mov cx, 2
lea dx, new_line
call WriteNow
jmp exit12
mem7:
call adr_to_hex
mov cx, 6
lea dx, rm_tiesiog
call WriteNow
mov cx, 2
lea dx, new_line
call WriteNow
jmp exit12
;=========================================
disMOV8:
mov al, [si]
cmp al, MOV8
jne LEA1
mov cx, 4
lea dx, asm_mov
call WriteNow
inc si
mov al,[si]
shr al,6
cmp al,00000011b
jne mem8
mov al,[si]
and al,00000111b
call FindRegisterW
jmp sec8
mem8:
call adr_to_hex
mov cx, 6
lea dx, rm_tiesiog
call WriteNow
sub si,2
sec8:
mov cx,1
lea dx,kablelis
call WriteNow
mov al,[si]
and al,00111000b
shr al,3
call FindRegisterS
mov cx, 2
lea dx, new_line
call WriteNow
jmp exit12
;=========================================
LEA1:
mov al, [si]
cmp al, LEA_BIN
jne exit12
mov cx, 4
lea dx, asm_lea
call WriteNow
mov al,[si]
and al,00111000b
shr al,3
call FindRegisterW
mov cx,1
lea dx,kablelis
call WriteNow
mov al,[si]
and al,00000111b
call FindMem
mov cx, 2
lea dx, new_line
call WriteNow
exit12:
ret
;=========================================
Dissasemble ENDP
;=========================================
FindRegisterS PROC NEAR
cmp al, reg_ES_
jne next001
mov cx,2
lea dx,reg_es
call writeNow
jmp return004
next001:
cmp al, reg_CS_
jne next002
mov cx,2
lea dx,reg_cs
call writeNow
jmp return004
next002:
cmp al, reg_DS_
jne next003
mov cx,2
lea dx,reg_ds
call writeNow
jmp return004
next003:
cmp al, reg_SS_
jne return004
mov cx,2
lea dx,reg_ss
call writeNow
return004:
ret
FindRegisterS ENDP
;=========================================
FindRegisterW PROC NEAR
cmp al,reg_AX_
jne next011
mov cx,2
lea dx,reg_ax
call WriteNow
jmp return001
next011:
cmp al, reg_BX_
jne next021
mov cx,2
lea dx, reg_bx
call WriteNow
jmp return001
next021:
cmp al,reg_CX_
jne next031
mov cx, 2
lea dx,reg_cx
call WriteNow
jmp return001
next031:
cmp al,reg_DX_
jne next041
mov cx,2
lea dx,reg_dx
call WriteNow
jmp return001
next041:
cmp al,reg_SP_
jne next051
mov cx,2
lea dx,reg_sp
call WriteNow
jmp return001
next051:
cmp al, reg_BP_
jne next061
mov cx,2
lea dx, reg_bp
call WriteNow
jmp return001
next061:
cmp al,reg_SI_
jne next071
mov cx, 2
lea dx,reg_si
call WriteNow
jmp return001
next071:
cmp al,reg_DI_
jne return001
mov cx,2
lea dx,reg_di
call WriteNow
return001:
ret
FindRegisterW ENDP
;=========================================
RegFind PROC NEAR
cmp w,1
je findWord
call FindRegister
jmp exitRegFind
findWord:
call FindRegisterW
exitRegFind:
ret
RegFind ENDP
;=========================================
FindRegister PROC NEAR
cmp al,reg_AL_
jne next01
mov cx,2
lea dx,reg_al
call WriteNow
jmp return00
next01:
cmp al,reg_BL_
jne next02
mov cx,2
lea dx,reg_bl
call WriteNow
jmp return00
next02:
cmp al,reg_CL_
jne next03
mov cx,2
lea dx,reg_cl
call WriteNow
jmp return00
next03:
cmp al, reg_DL_
jne next04
mov cx, 2
lea dx, reg_dl
call WriteNow
jmp return00
next04:
cmp al, reg_AH_
jne next05
mov cx, 2
lea dx, reg_ah
call WriteNow
jmp return00
next05:
cmp al, reg_BH_
jne next06
mov cx, 2
lea dx, reg_bh
call WriteNow
jmp return00
next06:
cmp al, reg_CH_
jne next07
mov cx, 2
lea dx, reg_ch
call WriteNow
jmp return00
next07:
cmp al, reg_DH_
jne return00
mov cx, 2
lea dx, reg_dh
call WriteNow
return00:
ret
FindRegister ENDP
;=========================================
FindMem PROC NEAR
cmp al, rm_BXSI_
jne @next11
mov cx, 7
lea dx, rm_bxsi
call WriteNow
jmp return01
@next11:
cmp al, rm_BXDI_
jne @next12
mov cx, 7
lea dx, rm_bxdi
call WriteNow
jmp return01
@next12:
cmp al, rm_BPSI_
jne @next13
mov cx, 7
lea dx, rm_bpsi
call WriteNow
jmp return01
@next13:
cmp al, rm_BPDI_
jne @next14
mov cx, 7
lea dx, rm_bpdi
call WriteNow
jmp return01
@next14:
cmp al, rm_SI_
jne @next15
mov cx, 4
lea dx, rm_si
call WriteNow
jmp return01
@next15:
cmp al, rm_DI_
jne @next16
mov cx, 4
lea dx, rm_di
call WriteNow
jmp return01
@next16:
cmp al, rm_TIESIOG_
jne @next17
mov cx, 6
call adr_to_hex
lea dx, rm_tiesiog
call WriteNow
jmp return01
@next17:
cmp al, rm_BX_
jne return01
mov cx, 4
lea dx, rm_bx
call WriteNow
return01:
ret
FindMem ENDP
;=========================================
WriteNow PROC NEAR
mov ah, 40h
mov bx, handle2
int 21h
ret
WriteNow ENDP
;=========================================
toDos PROC NEAR
mov ah, 4Ch
int 21h
toDos ENDP
;=========================================
adr_to_hex PROC NEAR
xor ax,ax
lea bx,hex_table
inc si
mov al,[si]
shr al,4
xlat
mov rm_tiesiog[3],al
mov al,[si]
and al,0fh
xlat
mov rm_tiesiog[4],al
inc si
mov al,[si]
shr al,4
and al,0fh
xlat
mov rm_tiesiog[1],al
mov al,[si]
and al,0fh
xlat
mov rm_tiesiog[2],al
ret
adr_to_hex ENDP
;=========================================
im_to_hex PROC NEAR
xor ax,ax
lea bx,hex_table
mov al,[si]
shr al,4
xlat
mov im_hex[0],al
mov al,[si]
and al,0fh
xlat
mov im_hex[1],al
ret
im_to_hex ENDP
;=========================================
Code ENDS
END Start
